9761a7f56b626266458f29176edbb2bf34c02861,src/com/redhat/ceylon/compiler/java/codegen/CallableBuilder.java,CallMethodForVariadic,makeMethod,#number#,706

Before Change


                    }
                    if (a < getMinimumArguments()) {
                        // append the downcast parameter
                        stmts.append(makeDowncastOrDefaultVar(
                                getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo));
                        args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
                    } else {
                        break;
                    }
                }
                for (; args.size() < numParams; a++) {
                    Parameter param = paramLists.getParameters().get(a);
                    if (param.isSequenced()) {
                        //args.append(gen.makeEmptyAsSequential(true));
                        a = makeSequencedArgument(arity, stmts, args, a);
                    } else {
                        SyntheticName name = getCallableTempVarName(param, forwardCallTo);
                        stmts.append(makeDowncastOrDefaultVar(
                                name, param, a, arity, forwardCallTo));
                        args.append(name.makeIdent());
                    }
                }
            } else { // we're generating the $call(Object...) method
                // THE OLD CODE
                // pass along the parameters
                Parameter variadicParameter = getVariadicParameter();
                int a = 0;
                for(Parameter param : paramLists.getParameters()){
                    // don't read default parameter values for forwarded calls
                    if(param.isSequenced())
                        break;
                    stmts.append(makeDowncastOrDefaultVar(
                            getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo));
                    args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
                    a++;
                }
                ListBuffer<JCExpression> varargs = ListBuffer.<JCExpression>lb();
                if (arity > CALLABLE_MAX_FIZED_ARITY) {
                    
                    args.append(makeRespread( 
                            List.<JCExpression>of(
                                    gen.makeReifiedTypeArgument(getVariadicIteratedType()),
                                    gen.make().Literal(numParams-1),
                                    gen.make().Binary(JCTree.MINUS, gen.naming.makeQualIdent(makeParamIdent(gen,  0), "length"), gen.make().Literal(numParams-1)),
                                    makeParamIdent(gen,  0),
                                    gen.makeEmpty())));
                } else {
                    JCExpression varargsSequence;
                    for (int j = getMinimumParameters(); j < arity; j++) {
                        Parameter param = paramLists.getParameters().get(Math.min(j, numParams-1));
                        if (arity < numParams - 1) {
                            stmts.append(makeDowncastOrDefaultVar(
                                    getCallableTempVarName(param, forwardCallTo), param, j, arity, forwardCallTo));
                        } else {
                            varargs.append(gen.make().Ident(makeParamName(gen, j)));
                        }
                    }
                    
                    // TODO Sometimes we need to call Util.sequentialInstance
                    
                    if (varargs.isEmpty()) {
                        varargsSequence = gen.makeEmptyAsSequential(true);
                    } else {
                        varargsSequence = gen.makeSequence(varargs.toList(), 
                                getVariadicIteratedType(), 0);
                    }
                    SyntheticName vname = getCallableTempVarName(getVariadicParameter(), forwardCallTo).suffixedBy("$");
                    args.append(vname.makeIdent());
                    stmts.append(makeVar(variadicParameter, getVariadicType(), 
                            forwardCallTo, vname, varargsSequence));
                }
                // /THE OLD CODE
            }

After Change


                    }
                    if (a < getMinimumArguments()) {
                        // append the downcast parameter
                        makeDowncastOrDefaultVar(stmts, 
                                getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo);
                        args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
                    } else {
                        break;
                    }
                }
                for (; args.size() < numParams; a++) {
                    Parameter param = paramLists.getParameters().get(a);
                    if (param.isSequenced()) {
                        //args.append(gen.makeEmptyAsSequential(true));
                        a = makeSequencedArgument(arity, stmts, args, a);
                    } else {
                        SyntheticName name = getCallableTempVarName(param, forwardCallTo);
                        makeDowncastOrDefaultVar(stmts,
                                name, param, a, arity, forwardCallTo);
                        args.append(name.makeIdent());
                    }
                }
            } else { // we're generating the $call(Object...) method
                // THE OLD CODE
                // pass along the parameters
                Parameter variadicParameter = getVariadicParameter();
                int a = 0;
                for(Parameter param : paramLists.getParameters()){
                    // don't read default parameter values for forwarded calls
                    if(param.isSequenced())
                        break;
                    makeDowncastOrDefaultVar(stmts,
                            getCallableTempVarName(param, forwardCallTo), param, a, arity, forwardCallTo);
                    args.append(getCallableTempVarName(param, forwardCallTo).makeIdent());
                    a++;
                }
                ListBuffer<JCExpression> varargs = ListBuffer.<JCExpression>lb();
                if (arity > CALLABLE_MAX_FIZED_ARITY) {
                    
                    args.append(makeRespread( 
                            List.<JCExpression>of(
                                    gen.makeReifiedTypeArgument(getVariadicIteratedType()),
                                    gen.make().Literal(numParams-1),
                                    gen.make().Binary(JCTree.MINUS, gen.naming.makeQualIdent(makeParamIdent(gen,  0), "length"), gen.make().Literal(numParams-1)),
                                    makeParamIdent(gen,  0),
                                    gen.makeEmpty())));
                } else {
                    JCExpression varargsSequence;
                    for (int j = getMinimumParameters(); j < arity; j++) {
                        Parameter param = paramLists.getParameters().get(Math.min(j, numParams-1));
                        if (arity < numParams - 1) {
                            makeDowncastOrDefaultVar(stmts,
                                    getCallableTempVarName(param, forwardCallTo), param, j, arity, forwardCallTo);
                        } else {
                            varargs.append(gen.make().Ident(makeParamName(gen, j)));
                        }
                    }
                    
                    // TODO Sometimes we need to call Util.sequentialInstance
                    
                    if (varargs.isEmpty()) {
                        varargsSequence = gen.makeEmptyAsSequential(true);
                    } else {
                        varargsSequence = gen.makeSequence(varargs.toList(), 
                                getVariadicIteratedType(), 0);
                    }
                    SyntheticName vname = getCallableTempVarName(getVariadicParameter(), forwardCallTo).suffixedBy("$");
                    args.append(vname.makeIdent());
                    makeVar(stmts, variadicParameter, getVariadicType(), 
                            forwardCallTo, vname, varargsSequence);
                }
                // /THE OLD CODE
            }